const express = require('express')
const jwtoken = require('jsonwebtoken')
const { expressjwt: jwt } = require('express-jwt')
// 定义 secret 密钥字符串
const secretKey = 'cdiosahvrpeuhgvvee'

const app = express()
const port = 3000
app.use(express.urlencoded({ extended: false }))
app.use(express.json())


app.post('/api/settoken', (req, res) => {
    res.json({
        code: "200",
        msg: '设置成功',
        // jwtoken.sign 三个参数 用户信息，密钥，配置对象 expiresIn：配置有效期
        token: jwtoken.sign({ username: req.body.username, sex: req.body.sex }, secretKey, { expiresIn: '1h' }) // 30h 小时
        // eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6ImNhc2R2ZHN2Iiwic2V4IjoiMTEyMjIxMTEiLCJpYXQiOjE3MDU0MTkzMjQsImV4cCI6MTcwNTQxOTM1NH0.LFeLG1lUxf_b1UvovNHy5h9-iYlxKILON9nmbu7FZSA
    })

})


// 解析后的 token 会自动挂载到 req的 auth 属性上  jwt配置项必填参数 secret：解密key algorithms: ["HS256"]  算法 
//      解析 token 的中间件             配置那些接口不需要 token 权限
app.use(jwt({ secret: secretKey, algorithms: ["HS256"] }).unless({ path: [/^api\//] }))
app.get('/api_v/gettoken', (req, res) => {
    console.log(req.auth)
    res.json({
        code: "200",
        msg: '获取成功',
        // jwt.sign 三个参数 用户信息，密钥，配置对象 expiresIn：配置有效期
        data: req.auth
    })

})

// 设置全局错误中间件
app.use((err,req,res,next)=>{
    // console.log(err)
  
    if(err.name === 'UnauthorizedError') {   // 这次 错误 是由 token 解析失败导致的 
      return  res.json({
            code:401,
            msg:'token失效'
        })
    }
    res.json({
        code:500,
        msg:"服务器异常"
    })
})
app.listen(port, () => console.log(`Example app listening on port ${port}!`))